package server

import (
	"encoding/json"
	"iris/db"
	"math/rand"
	"strconv"
	"time"

	"github.com/gomodule/redigo/redis"
	"github.com/tidwall/gjson"
)

// 生成token
func EnToken(authId int, info map[string]interface{}) string {

	// 配置文件名
	systemInfo := "system.json"

	// 获取配置信息
	system := GetFile(systemInfo)

	// redis前缀
	redis_prefix := gjson.Get(system, "core.redis_prefix").String()
	// token密钥
	token_key := gjson.Get(system, "core.token_key").String()

	// 唯一标识 (纳秒+100万内随机数)
	unixNano := strconv.FormatInt(time.Now().UnixNano(), 10)
	rand := strconv.Itoa(rand.Intn(1000000))
	unique := unixNano + rand + token_key

	// token
	token := Msha1(unique)
	info["token"] = token

	// 数据转json
	jsonInfo, _ := json.Marshal(info)
	infoStr := string(jsonInfo)

	// 数据aes加密
	infoAes := MenAes(infoStr)

	// redis存token的键名
	authIdStr := strconv.Itoa(authId)
	redis_token_key := redis_prefix + "_token_" + authIdStr

	// 存redis
	redigo := db.Redis()
	redigo.Do("Set", redis_token_key, token)

	return infoAes
}

type TokenData struct {
	AuthId  int    `json:"authId"`
	Account string `json:"account"`
	Token   string `json:"token"`
}

// 验证token
func DeToken(token string) int {

	// 配置文件名
	systemInfo := "system.json"

	// 获取配置信息
	system := GetFile(systemInfo)

	// redis前缀
	redis_prefix := gjson.Get(system, "core.redis_prefix").String()

	// aes解密
	infoStr := MdeAes(token)
	if infoStr == "" {
		return 0
	}

	// token数据
	var tokenInfo TokenData
	json.Unmarshal([]byte(infoStr), &tokenInfo)

	// 登录ID
	authId := tokenInfo.AuthId
	// token
	tokenStr := tokenInfo.Token

	// redis存token的键名
	authIdStr := strconv.Itoa(authId)
	redis_token_key := redis_prefix + "_token_" + authIdStr

	// 获取token
	redigo := db.Redis()
	redisToken, _ := redigo.Do("Get", redis_token_key)
	redisTokenStr, _ := redis.String(redisToken, nil)

	// 比对token
	if redisTokenStr != tokenStr {
		return 0
	} else {
		return 1
	}
}
